class MySecurity.Utf{
	
	public static function utf16to8(str:String):String {
		var out:Array;
		var i:Number=0;
		var len:Number;
		var c:Number;
		out = new Array();
		len = str.length;
		while(i<len){
			c = str.charCodeAt(i);
			if ((c >= 0x0001) && (c <= 0x007F)) {
				out[i] = str.charAt(i);
			} else if (c > 0x07FF) {
				out[i] =String.fromCharCode(0xE0 | ((c >> 12) & 0x0F),0x80 | ((c >>  6) & 0x3F),0x80 | ((c >>  0) & 0x3F));
				
			} else {
				out[i] =String.fromCharCode(0xC0 | ((c >>  6) & 0x1F),0x80 | ((c >>  0) & 0x3F));
			}
			i++;
		}
		return out.join('');
	}
	public static function utf8to16(str:String):String {
		var out:Array;
		var i:Number, len:Number, c:Number;
		var char2:Number, char3:Number;

		out = [];
		len = str.length;
		i = 0;
		while(i < len) {
			c = str.charCodeAt(i++);
			switch(c >> 4)
			{ 
				case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
				// 0xxxxxxx
				out[out.length] = str.charAt(i-1);
				break;
				case 12: case 13:
				// 110x xxxx   10xx xxxx
				char2 = str.charCodeAt(i++);
				out[out.length] = String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
				break;
				case 14:
				// 1110 xxxx  10xx xxxx  10xx xxxx
				char2 = str.charCodeAt(i++);
				char3 = str.charCodeAt(i++);
				out[out.length] = String.fromCharCode(((c & 0x0F) << 12) |
					((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0));
				break;
			}
		}

		return out.join('');
	}
}